`timescale 1ns / 1ps
`include "defines.v"
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2021/12/09 08:48:32
// Design Name: 
// Module Name: ex
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module ex(
    input wire rst,
    input wire[`AluSelBus] alusel_i,
    input wire[`AluOpBus] aluop_i,
    input wire[`RegBus] reg1_i,
    input wire[`RegBus] reg2_i,
    input wire[`RegAddrBus] wd_i,       // 目的寄存器
    input wire wreg_i,                  // 是否执行写目的寄存器

    // 执行的结果
    output reg[`RegAddrBus] wd_o,      // 最终要写入的目的寄存器地址
    output reg wreg_o,                 // 是否有要写入的目的寄存器
    output reg[`RegBus] wdata_o         // 最终要写入的目的寄存器值
    );

    // 保存逻辑运算的值
    reg[`RegBus] logicout;

    // 第一阶段：根据aluop_i指示，进行子类型运算
    always @ (*) begin
        if (rst == `RstEnable) begin
            logicout <= `ZeroWord;
        end else begin
            case (aluop_i)
                `EXE_OR_OP: begin
                    logicout <= reg1_i | reg2_i;
                end
                default:    begin
                    logicout <= `ZeroWord;
                end 
            endcase
        end
    end

    // 第二阶段：根据alusel，选择最终的结果
    always @ (*) begin
        wd_o <= wd_i;
        wreg_o <= wreg_i;
        case (alusel_i)
            `EXE_RES_LOGIC: begin
                wdata_o <= logicout;
            end 
            default: begin
                wdata_o <= `ZeroWord;
            end
        endcase
    end
endmodule
